fix: correctly reschedule deferred effects when reviving a batch after async work #17332
+71
−19
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Simpler alternative to #17101. The bug here was that if an effect was scheduled during traversal, causing a follow-up traversal, an effect that was previously deferred would (having been marked
CLEAN) incorrectly go into the#maybe_dirty_effectsbucket rather than back into the#dirty_effectsbucket. The solution is to persist the dirty bucket between runs.Since block effects run immediately during traversal, they are always made
CLEANimmediately, and so should be added to the#dirty_effectsbucket straight away rather than being handled in a separateblock_effectsarray — this allows us to simplify the effecttargeta little bit.Before submitting the PR, please make sure you do the following
feat:,fix:,chore:, ordocs:.packages/svelte/src, add a changeset (npx changeset).Tests and linting
pnpm testand lint the project withpnpm lint